package com.thd.springboottest.camunda.controller;

import com.thd.springboottest.camunda.service.WorkFlowService;
import org.camunda.bpm.engine.ProcessEngine;
import org.camunda.bpm.engine.runtime.MessageCorrelationBuilder;
import org.camunda.bpm.engine.runtime.ProcessInstance;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;

/**
 * com.thd.springboottest.camunda.controller.CamundaController
 *
 * @author: wanglei62
 * @DATE: 2022/5/26 17:01
 **/
@Controller
@RequestMapping("/camunda/eventGateway")
public class Camunda04eventGateway {
    @Autowired
    private ProcessEngine processEngine;
    @Autowired
    private WorkFlowService workFlowService;
    /**
     * 部署
     */
    // url : http://127.0.0.1:8899/thd/camunda/eventGateway/deploy
    @RequestMapping(value="/deploy",method = RequestMethod.GET)
    @ResponseBody
    public ResponseEntity<String> deploy(){
        String deployId = this.workFlowService.deploy("processes/04eventGateway.bpmn");
        System.out.println("deployId:" + deployId);
        return ResponseEntity.ok("SUCCESS");
    }

    /**
     * 开启流程
     */
    // url : http://127.0.0.1:8899/thd/camunda/eventGateway/startProcess/[businessKey:gateway001]
    @RequestMapping(value="/startProcess/{businessKey}",method = RequestMethod.GET)
    @ResponseBody
    public ResponseEntity<String> startProcess(@PathVariable String businessKey){
        ProcessInstance pi = processEngine.getRuntimeService().startProcessInstanceByKey("eventGateway",businessKey);
       System.out.println("流程实例ID:" + pi.getProcessInstanceId());
        return ResponseEntity.ok("SUCCESS");
    }




    // ================================= 方式1 通过捕获conditional 继续往下扭转 ==================================== //
    /*
    查询待办
    已有待办TaskA
     */
    /*
    完成TaskA的代办
     */

    /*
    查看流程待办
    没有待办了
    该流程因为到了事件网关，所以流程已停，直到捕获到事件(流程变量设置)
     */

    /*
    设置流程变量
    http://127.0.0.1:8899/thd/camunda/addVariableForProcessInstance/[processInstanceId]
    {
        "a": 1
    }305265ef-e220-11ec-9aab-e86a64fc0114
     */

    /*
    查看流程待办
    已经变成了TaskC , 注意这里仅仅是设了流程变量 a=1 , 并没有执行任何扭转，
    流程自动捕获到这个流程变量的设置，流程变量的值满足了当前条件，所以流程自动往下走了
     */


    // ================================= 方式2 通过捕获timer 继续往下扭转 ==================================== //

    /*
    查询待办
    已有待办TaskA
     */
    /*
    完成TaskA的代办
     */

    /*
    查看流程待办
    没有待办了
    该流程因为到了事件网关，所以流程已停，直到捕获到事件(Timer时间)
     */

    /*
    等待30秒,因为设置了定时器(Timer 定时了30秒),所以过了30秒后流程自动往下走
     */
    /*
    查看流程待办
    可以查到TaskC
     */

    // ================================= 方式3 通过消息 让流程继续往下扭转 ==================================== //
    /*
    注：部署流程的时候需要将上面的30秒timer 改长一些，以免下面的操作超过30秒导致流程被Timer走下去
     */


     /*
    查询待办
    已有待办TaskA
     */
    /*
    完成TaskA的代办
     */

    /*
    查看流程待办
    没有待办了
    该流程因为到了事件网关，所以流程已停，直到捕获到事件(收到消息)
     */


    /**
     * 发送消息触发消息捕获时间，使得往下扭转
     */
    // url : http://127.0.0.1:8899/thd/camunda/eventGateway/sendMsg/[businessKey]
    @RequestMapping(value="/sendMsg/{businessKey}",method = RequestMethod.GET)
    @ResponseBody
    public ResponseEntity<String> sendMsg(@PathVariable String businessKey){
        ProcessInstance pi = processEngine.getRuntimeService().createProcessInstanceQuery().processInstanceBusinessKey(businessKey).singleResult();
        System.out.println("流程实例ID:" + pi.getProcessInstanceId());

        String msg = "msg";
        MessageCorrelationBuilder messageCorrelation = processEngine.getRuntimeService().createMessageCorrelation(msg);

        //设置关联实例ID
        messageCorrelation.processInstanceId(pi.getId());

        //执行
        messageCorrelation.correlate();

        return ResponseEntity.ok("SUCCESS");
    }


    /*
    查看流程待办
    可以查到TaskC
     */




    // ================================= 方式4 通过信号 让流程继续往下扭转 ==================================== //

    /*
    查询待办
    已有待办TaskA
     */
    /*
    完成TaskA的代办
     */
    /**
     * 发送信号，使得往下扭转
     */
    // url : http://127.0.0.1:8899/thd/camunda/eventGateway/signal
    @RequestMapping(value="/signal",method = RequestMethod.GET)
    @ResponseBody
    public ResponseEntity<String> signal(){

        String signal = "signal";
        processEngine.getRuntimeService().createSignalEvent(signal).send();

        return ResponseEntity.ok("SUCCESS");
    }
    /*
    查看流程待办
    没有待办了
    该流程因为到了事件网关，所以流程已停，直到捕获到事件(发送信号)
     */


    /**
     * 信号事件跟消息事件的区别：
     *   消息时针对某个流程实例发送的
     *   信号只能是全局的
     */

}
